<?php

/**
 * 公共方法类
 * @package  htdocs
 * @subpackage  module/base
 * @version 1.0
 */
class commHandler {

    private $dbca;

    public function __construct( $dbca=null ) {
        if (!is_null($dbca))
            $this->dbca = $dbca;
    }


    /**
     * 公共的查询列表页数据
     * @param array  $arg_array                          查询参数数组
     * $arg_array = array(
            'sortname' => string, 排序字段
            'sortorder' => string, 排序方式
            'page' => int, 分页页数
            'rp' => int, 分页页数
     * )
     * @param string $table_name                         表名
     * @param array  $extend_array
     * $extend_array = array(
            'field' => 1|2|3   1、普通值模糊查询 2、加密值模糊查询 3、in查询
     * )
     * @return null
     */
    public function search( &$arg_array, $table_name, $extend_array = null ) {

        //sql字符串
        $sql = '';

        //参数类型字符串
        $params_type = '';

        //参数值数组
        $params_array = array();

        if (isset($arg_array) && is_array($arg_array)) {

            foreach($arg_array as $key => &$value) {

                if (in_array($key, array('sortname', 'sortorder', 'page', 'rp', 'extend')))
                    continue;

                if(gettype ( $value ) == 'integer'){
                    $bindType = 'i';
                } elseif(gettype ( $value ) == 'double'){
                    $bindType = 'd';
                } elseif (gettype ($value ) == 'string'){
                    $bindType = 's';
                } else{
                    $bindType = 's';
                }

                if (isset($extend_array[$key])) {

                    if ($extend_array[$key] == 1) {

                        $sql .= sprintf(' AND %s LIKE ?', $key);
                        $params_type .= $bindType;
                        $params_array[] = '%' . $value . '%';

                    } else if ($extend_array[$key] == 2) {

                        $sql .= sprintf(' AND %s LIKE ?', $key);
                        $params_type .= $bindType;
                        $params_array[] = '%' . encrypt_paramD($value) . '%';

                    } else if ($extend_array[$key] == 3) {

                        $sql .= sprintf(' AND %s IN (%s)', $key, $value);

                    }

                } else {

                    $sql .= sprintf(' AND %s = ?', $key);
                    $params_type .= $bindType;
                    $params_array[] = $value;

                }


            }

        }

        if (isset($arg_array['extend']) && !empty($arg_array['extend'])) {
            $sql .= $arg_array['extend'];
        }

        if ($sql) {
            $sql = ' WHERE ' . substr($sql, 4);
        }

        $sql = $table_name . $sql;


        try {

            if (isset($arg_array['rp']) && $arg_array['rp'] > 0) {

                //统计分类数量
                $search_sql = 'SELECT COUNT(*) AS item_count FROM ' . $sql;
                $count_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);
                $item_count = $count_array[0]->item_count;
                if ($item_count == 0) {
                    $arg_array['count'] = 0;
                    return null;
                }

                $arg_array['count'] = $item_count;

                //排序
                if (isset($arg_array['sortname']) && !empty($arg_array['sortname']))
                    $sql .= sprintf(' ORDER BY %s %s', $arg_array['sortname'], $arg_array['sortorder']);

                //分页
                if (!isset($arg_array['page']) || !is_numeric($arg_array['page']) || $arg_array['page'] <= 0)
                    $arg_array['page'] = 1;

                $sql .= sprintf(' LIMIT %d, %d', ($arg_array['page'] - 1) * $arg_array['rp'], $arg_array['rp']);

            } else {

                //排序
                if (isset($arg_array['sortname']) && !empty($arg_array['sortname']))
                    $sql .= sprintf(' ORDER BY %s %s', $arg_array['sortname'], $arg_array['sortorder']);

            }

            //查询分类信息
            $search_sql = 'SELECT * FROM ' . $sql;
            $item_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);
            
            return $item_array;

        } catch (Exception $e) {

            error_log($e->getMessage());
            return null;

        }

    }
    
    /**
     * 公共的查询表数据的数量
     * @param array  $arg_array                          查询参数数组
     * $arg_array = array(
            'pcustID' => 100061 查询字段
     * )
     * @param string $table_name                         表名
     * @param array  $extend_array
     * $extend_array = array(
            'field' => 1|2|3   1、普通值模糊查询 2、加密值模糊查询 3、in查询
     * )
     * @return null
     */
    public function searchCount( $arg_array, $table_name, $extend_array = null ) {

        //sql字符串
        $sql = '';

        //参数类型字符串
        $params_type = '';

        //参数值数组
        $params_array = array();

        if (isset($arg_array) && is_array($arg_array)) {

            foreach($arg_array as $key => &$value) {

                if (in_array($key, array('extend')))
                    continue;

                if(gettype ( $value ) == 'integer'){
                    $bindType = 'i';
                } elseif(gettype ( $value ) == 'double'){
                    $bindType = 'd';
                } elseif (gettype ($value ) == 'string'){
                    $bindType = 's';
                } else{
                    $bindType = 's';
                }

                if (isset($extend_array[$key])) {

                    if ($extend_array[$key] == 1) {

                        $sql .= sprintf(' AND %s LIKE ?', $key);
                        $params_type .= $bindType;
                        $params_array[] = '%' . $value . '%';

                    } else if ($extend_array[$key] == 2) {

                        $sql .= sprintf(' AND %s LIKE ?', $key);
                        $params_type .= $bindType;
                        $params_array[] = '%' . encrypt_paramD($value) . '%';

                    } else if ($extend_array[$key] == 3) {

                        $sql .= sprintf(' AND %s IN (%s)', $key, $value);

                    }

                } else {

                    $sql .= sprintf(' AND %s = ?', $key);
                    $params_type .= $bindType;
                    $params_array[] = $value;

                }


            }

        }

        if (isset($arg_array['extend']) && !empty($arg_array['extend'])) {
            $sql .= $arg_array['extend'];
        }

        if ($sql) {
            $sql = ' WHERE ' . substr($sql, 4);
        }

        $sql = $table_name . $sql;
		
        try {
        	
			//统计数据数量
	        $search_sql = 'SELECT COUNT(*) AS item_count FROM ' . $sql;
	        $count_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);
	        
	        if (isset($count_array[0]->item_count)) {
	        	return $count_array[0]->item_count;
	        } else {
	        	return null;
	        }
				        
		} catch (Exception $e) {
			error_log($e->getMessage());
            return null;
		}
        
    }

    /**
     * 生成流水号
     * @param string $name 流水号名称
     * @param null|string $prefix 前缀
     * @return null|string
     */
    public function generate_seqno($name, $prefix=null) {

		$seq_no = null;
		$seq_no_ge = null;

		if ($this->dbca->stmt_query('UPDATE sys_seqno SET seqno = seqno + 1 WHERE name = ?', 's', $name)){
			$seq_no = $this->dbca->stmt_query('SELECT seqno FROM sys_seqno WHERE name = ?', 's', $name);
            if (!is_null($seq_no)) {
                $seq_no = $seq_no[0]->seqno;
            }
		}
		if (is_null($seq_no))
			return null;
			
		switch ($name) {
			case 'seqno_bill':
            case 'seqno_bill_goods':
            case 'seqno_log':
            case 'seqno_wechat_log':
                $seq_no_ge = date('Ymd') . str_repeat('0',10 - strlen($seq_no)) . $seq_no;
                break;
			default:
				$seq_no_ge = $seq_no;
				break;
		}
		if (!is_null($prefix))
			$seq_no_ge = $prefix . $seq_no_ge;

		return $seq_no_ge;

	}

    /**
     * 获得数据表最大的排序序号
     * @param string $table_name 表名
     * @param string $sort_field 排序序号字段名，默认为sortOrder
     * @return int
     */
    public function getSortNum( $table_name, $sort_field = 'sortOrder' ) {

        if (!isset($table_name) || empty($table_name)) {
            return 0;
        }

        try {

            //查询最大排序序号
            $search_sql = sprintf('SELECT IF(MAX(%s) IS NULL ,1 , MAX(%s)+1) AS max_sort FROM %s', $sort_field, $sort_field, $table_name);
            $sort_array = $this->dbca->stmt_query($search_sql);

            //返回排序序号
            return $sort_array[0]->max_sort;

        } catch (Exception $e) {
            error_log($e->getMessage());
            return 0;
        }

    }

    /**
     * 检测变量是否是URL地址
     * @author 刘道健
     * @param string $val URL
     * @return bool
     */
    public function isUrl($val) {
        return preg_match('/^(((ht|f)tp(s?))\:\/\/)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|cn|com.cn)(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*$/', $val);
    }

	/**
	 * 检测变量是否是邮件地址
	 * @author 刘道健
	 * @param string $val email
	 * @return bool
	 */
	public function isEmail($val) {
		return preg_match('/^[\w-]+(\.[\w-]+)*\@[A-Za-z0-9]+((\.|-|_)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/', $val);
	}


	/**
	 * 检测变量是否是密码
	 * 密码只能是6-30位英文、数字及“_”、“-”组成
	 * @author 刘道健
	 * @param string $val 密码
	 * @return bool
	 */
	public function isPwd($val) {
		return preg_match('/^[\w-]{6,30}$/', $val);
	}


	/**
	 * 检测变量是否是邮政编码
	 * 邮政编码必须是6位的数字
	 * @author 刘道健
	 * @param int $val 邮政编码
	 * @return bool
	 */
	public function isPostalCode($val) {
		return preg_match('/^[\d]{6}$/', $val);
	}


	/**
	 * 检测变量是否是手机号码
	 * 手机号码必须是11位的数字，第一位数字必须为1，第二数字必须是34568中的任意一个
	 * @param string $val 手机号码
	 * @return bool
	 */
	public function isMobile($val) {
		return preg_match('/^1[34568]+\d{9}$/', $val);
	}


	/**
	 * 检测变量是否是座机号码
	 * 3-4位区号，7-8位直播号码，1－4位分机号
	 * @param string $val 座机号码
	 * @return bool
	 */
	public function isPhone($val) {
		return preg_match('/^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/', $val);
	}


	/**
	 * 检测变量是否是金额
	 * @param string $val 金额
     * @param int $type 默认为空【1.大于0的金额 2.大于等于的金额 3.小于0的金额 4.小于等于0的金额】
	 * @return bool
	 */
	public function isMoney( $val, $type = null ) {

		if (!preg_match('/^\d*(\.\d{1,2})?$/', $val))
            return false;

        if ($type == 1 && $val <= 0)
            return false;
        else if ($type == 2 && $val < 0)
            return false;
        else if ($type == 3 && $val >= 0)
            return false;
        else if ($type == 4 && $val > 0)
            return false;

        return true;

	}
	
	/**
	 * 处理数据
	 *
	 * @param string $str
	 * @return string
	 */
	public function getVal($val) {
		
		return $this->convertVar($val);
		
	}
	
    /**
     * 检测变量是否是日期或日期+时间
     * @param $val
     * @return bool
     */
    public function isDate( $val ) {
        return preg_match('/^\d{4}-\d{2}-\d{2}|\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/s', $val);
    }


	/**
	 * 处理数据
	 * @param string $str
	 * @return string
	 */
	public function convertVar($val) {
		
		if (!isset($val) || empty($val))
			return null;
		return htmlspecialchars(trim($val));
		
	}

    /**
     * 处理扫描数据
     * @param string $str
     * @return string
     */
    public function scanVal( $val ){

        $sonVal = substr( $val , 0 , 1 );

        if( $sonVal == 0 ){
            return substr( $val , 1);
        }else{
            return $val;
        }

    }


    /**
     * 检查是否是整数
     * @param string $val 值
     * @param int $type 默认为空【1.大于0的整数 2.大于等于的整数 3.小于0的整数 4.小于等于0的整数】
     * @return bool
     */
    public function isInteger( $val, $type = null ) {

        if (ceil($val) != $val)
            return false;

        if ($type == 1 && $val <= 0)
            return false;
        else if ($type == 2 && $val < 0)
            return false;
        else if ($type == 3 && $val >= 0)
            return false;
        else if ($type == 4 && $val > 0)
            return false;

        return true;

    }


    /**
	 * 分页程序
	 * @author 刘道健
	 * @param int $pageIndex 当前页码
	 * @param int $count 总数量
	 * @param int $displayCount 每页显示数量
	 * @param string $link 分页链接，链接里的页码部分用%d代替，在本方法中会用sprintf函数替换%d为页码。例：/shop/member_order.php?pageIndex=%d
	 * @param object $smarty smarty对象实例
	 * @return null：总页小于等于1，不用分页
	 * 		   $pageHtml：分页HTML代码，在前台直接使用就可以
	 */
	public function shopPage($pageIndex, $count, $displayCount, $link, &$smarty, $tpl = 'page.tpl') {

		$pageCount = ceil($count / $displayCount);
		if ($pageCount == 1)
			return null;
		
		$pageLinks = array();
		if ($pageIndex > 1) {
			$pageLinks['goto_previous_page_link'] = sprintf($link, $pageIndex - 1);
		}
		if ($pageIndex < $pageCount) {
			$pageLinks['goto_next_page_link'] = sprintf($link, $pageIndex + 1);
		}
		$i = 1;
		while ($i <= $pageCount) {
			$pageLinks['link'][] = array('href' => sprintf($link, $i), 'text'=> $i);
			if ($pageIndex - 3 > $i) {
				$pageLinks['link'][] = array('href' => '', 'text'=> '...');
				$i = $pageIndex - 3;
			} else if ($i < $pageCount && $pageIndex + 3 < $i && $pageCount - 1 > $i) {
				$pageLinks['link'][] = array('href'=>'', 'text'=>'...');
				$i = $pageCount - 1;
			}
			$i++;
		}
		$pageLinks['pageIndex'] = $pageIndex;
		$pageLinks['total'] = $count;
		$pageLinks['pageCount'] = $pageCount;
		$smarty->assign_by_ref('pageLinks', $pageLinks);
		$pageHtml = $smarty->fetch($tpl);
		return $pageHtml;
		
	}

    /**
     * 获得仓库ID
     * @return int
     */
    public function getStoreID() {
        return 1;
    }


    public function searchRegion( &$arg_array ) {

        //sql字符串
        $sql = '';

        //参数类型字符串
        $params_type = '';

        //参数值数组
        $params_array = array();

        //区域ID
        if (isset($arg_array['id']) && is_numeric($arg_array['id'])) {
            $sql .= ' AND id = ?';
            $params_type .= 'i';
            $params_array[] = $arg_array['id'];
        }

        //上级区域ID
        if (isset($arg_array['parentID']) && is_numeric($arg_array['parentID'])) {
            $sql .= ' AND parentID = ?';
            $params_type .= 'i';
            $params_array[] = $arg_array['parentID'];
        }

        //区域类型
        if (isset($arg_array['level']) && is_numeric($arg_array['level'])) {
            $sql .= ' AND region_level = ?';
            $params_type .= 'i';
            $params_array[] = $arg_array['level'];
        }

        //区域名称
        if (isset($arg_array['name']) && !empty($arg_array['name'])) {
            $sql .= ' AND name = ?';
            $params_type .= 's';
            $params_array[] = $arg_array['name'];
        }

        if ($sql) {
            $sql = 'WHERE ' . substr($sql, 4);
        }

        try {

            if (isset($arg_array['rp']) && $arg_array['rp'] > 1) {

                //统计数量
                $search_sql = 'SELECT COUNT(*) AS item_count FROM sys_region ' . $sql;
                $count_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);
                $item_count = $count_array[0]->item_count;
                if ($item_count == 0) {
                    $arg_array['count'] = 0;
                    return null;
                }

                $arg_array['count'] = $item_count;

                //排序
                if (isset($arg_array['sortname']) && !empty($arg_array['sortname']))
                    $sql .= sprintf(' ORDER BY %s %s', $arg_array['sortname'], $arg_array['sortorder']);

                //分页
                if (!isset($arg_array['page']) || !is_numeric($arg_array['page']) || $arg_array['page'] <= 0)
                    $arg_array['page'] = 1;

                $sql .= sprintf(' LIMIT %d, %d', ($arg_array['page'] - 1) * $arg_array['rp'], $arg_array['rp']);

            } else {

                //排序
                if (isset($arg_array['sortname']) && !empty($arg_array['sortname']))
                    $sql .= sprintf(' ORDER BY %s %s', $arg_array['sortname'], $arg_array['sortorder']);

            }

            //查询分类信息
            $search_sql = 'SELECT * FROM sys_region ' . $sql;
            $temp_item_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);
            if (!$temp_item_array)
                return null;

            foreach($temp_item_array as &$item) {
                $item_array[] = array(
                    'id' => $item->id,
                    'name' => $item->name,
                    'parentID' => $item->parentID,
                    'sortOrder' => $item->sortOrder,
                    'region_level' => $item->region_level,
                    'postCode' => $item->postCode
                );
            }

            return $item_array;

        } catch (Exception $e) {

            error_log($e->getMessage());
            return null;

        }


    }

    /**
     * 把图片替换成延迟加载
     * @param string $description 内容
     * @param string $suffix 图片后缀
     * @return mixed
     */
    public function replaceImgToLazy( $description , $suffix = '' ){

        preg_match_all ('/(<img )(.[^>]*)(>)/', $description , $matchArray);
        if(empty($matchArray)) {
            return $description;
        }

        //被截取的图片正则
        $picArray = $matchArray[0] ;

        if(!empty($picArray)){
            foreach ($picArray as &$p_l)  {
                //检查是否已经存在orginalsrc
                if(stripos( $p_l , 'data-src') !== false)
                    continue ;

                //将图片打散
                $imgArr  = explode(' ', $p_l) ;
                $imgPath = '' ;
                if($imgArr) {
                    foreach ($imgArr as &$i_l) {
                        //将src 换成默认的图片路径
                        if(stripos( $i_l , 'src') !== false) {
                            $imgPath .= ' src="' . G_THEME_IMAGE_URL . 'comm/lazyloading.png" ' ;

                            //得到图片路径
                            $srcArr1  = explode('"' , $i_l) ;
                            $srcArr2  = explode("'" , $i_l) ;

                            if(count($srcArr1) > 1)
                                $srcStr = $srcArr1[1] ;
                            else
                                $srcStr = $srcArr2[1] ;

                            if($suffix != '')
                                $imgPath .= sprintf(' data-src="%s?%s" ' , $srcStr , $suffix) ;
                            else
                                $imgPath .= sprintf(' data-src="%s" ', $srcStr);
                        }else
                            $imgPath .= ' ' . $i_l . ' ' ;
                    }
                }

                //将图片重新放入到内容中
                $description = str_replace($p_l , $imgPath , $description) ;

            }
        }

        //返回最新的详情
        return $description;

    }

    public function category_search( $table_name, $extend_array = null ) {

        //排序
        $order = sprintf(' ORDER BY %s %s','sortOrder' ,'asc' );

        $search_sql  = 'SELECT * FROM '.$table_name . $order;

        $search_row = $this->dbca->stmt_query($search_sql);

        if($search_row){
            foreach( $search_row as $val){
                $midrow = $this->dbca->stmt_query('select * from goods_midcategory where bigCategoryID =? ','i',$val->bigCategoryID);
                if($midrow){
                    $ismid = 1;
                }else{
                    $ismid = 0;
                }

                $row[] = array(
                    'bigCategoryID' => $val->bigCategoryID,
                    'description' => $val->description,
                    'tagID' => $val->tagID,
                    'useFlg' => $val->useFlg,
                    'sortOrder' => $val->sortOrder,
                    'ismid' => $ismid
                );

            }
        }

        return  $row;

    }

    /**
     * 根据上级区域ID查询出所有地址
     * @param array $arg_array 参数数组
     * @return 返回详情的地址列表
     */
    public function getRegion( $arg_array ) {

        //区域列表
        $dataArray = array(''=>'请选择...');

        if (empty($arg_array)) {
            return $dataArray;
        }

        //查询区域
        $region_data = $this->search( $arg_array, 'sys_region' );

        //循环组装数组
        if ($region_data){
            foreach ($region_data as &$result_line){
                $dataArray[$result_line->id] = $result_line->name;
            }
        }

        //返回结果
        return $dataArray;
    }

    public function checkDatetime($tbale, $start_datetime, $end_datetime, $start_datetime_filed = 'startDate', $end_datetime_filed = 'endDate') {



    }

}